package com.euond.accv.mdm.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import com.euond.accv.mdm.client.dto.MdmStoreDTO;
import com.euond.accv.mdm.dao.MdmStoreDao;
import com.euond.accv.mdm.dao.MdmStoreGroupDao;
import com.euond.accv.mdm.domain.MdmStore;
import com.euond.accv.mdm.domain.MdmStoreGroup;
import com.euond.accv.mdm.dto.MdmStoreGroupDTO;
import com.euond.common.dao.BaseDao;
import com.euond.common.domain.search.SearchOperator;
import com.euond.common.domain.search.Searchable;
import com.euond.common.exception.MyselfMsgException;
import com.euond.common.service.BaseSimplePageService;

@Service("mdmStoreGroupService")
public class MdmStoreGroupService extends BaseSimplePageService<MdmStoreGroup, Integer>{
	
	@Autowired
	public MdmStoreGroupDao dao;
	
	@Autowired
	public MdmStoreDao mdmdao;
	
	private List<MdmStoreDTO> listDTO  = new ArrayList<MdmStoreDTO>();

	
	@Override
	protected BaseDao<MdmStoreGroup, Integer> init() {
		return dao;
	}
	
	
	/**
	 * 初始化第一级
	 * @return
	 */
	public List<MdmStoreGroupDTO> findMdmGrop(Searchable searchable){
		//先按降序查从下往上面找所有的数据，然后在组成树结构
		List<MdmStoreGroup> mdm = findAllWithSort(searchable);
		
		//先获取最后一个root节点p_store_group_no=0 convertToDto(mdm.remove(mdm.size()-1));
		MdmStoreGroupDTO mdmDTO =new MdmStoreGroupDTO(); //convertToDto(mdm.remove(mdm.size()-1));
		mdmDTO.setStoreGroupNo("1");
		mdmDTO.setIsLeaf(0);
		
		recursiveMdmGroup(mdmDTO,mdm);
		List<MdmStoreGroupDTO> listDTO= mdmDTO.getChildren();
		return listDTO;
	}
	
	
	/**
	 * 点击节点加载下面的子节点
	 * @return
	 */
	public List<MdmStoreGroupDTO> findMdmGropById(Searchable searchable,Integer isLeaf){
		//先按降序查从下往上面找所有的数据，然后在组成树结构

		List<MdmStoreGroup> mdm = findAllWithSort(searchable);
		
		//先获取最后一个root节点
		MdmStoreGroupDTO mdmDTO = new MdmStoreGroupDTO();
		//mdmDTO.setId(Integer.parseInt(searchable.getValue("pStoreGroupNo_eq")));
		mdmDTO.setStoreGroupNo(searchable.getValue("pStoreGroupNo_eq"));
		mdmDTO.setIsLeaf(isLeaf);
		recursiveMdmGroup(mdmDTO,mdm);
		List<MdmStoreGroupDTO> listDTO= mdmDTO.getChildren();
		return listDTO;
	}
	/**
	 * 通过选择数的节点ID过滤所有数据
	 * @return
	 */
	public List<MdmStoreGroup> findByPStoreGroupNo(Searchable searchable){
		//先按降序查从下往上面找所有的数据，然后在组成树结构
		Page<MdmStoreGroup> mdm = dao.findAll(searchable);	
		return mdm.getContent();
	}
	
	
	/**
	 * 递归查找 从下往上通过自己的父级
	 * @param dto
	 * @param mdm
	 */
	private static void recursiveMdmGroup(MdmStoreGroupDTO dto,List<MdmStoreGroup> listMdm){
		
		for(int i = listMdm.size() - 1; i >= 0; i--){
			MdmStoreGroup mdm = listMdm.get(i);
			if(mdm.getPStoreGroupNo().equals(dto.getStoreGroupNo())){
				dto.getChildren().add(convertToDto(mdm));
				listMdm.remove(i);//
			}
		}
		//优化速度只找一级
//		//递归需要继续找地2+n级
//		for(MdmStoreGroupDTO mdmDTO:dto.getChildren()){
//			//用第二级再去匹配列表清单
//			recursiveMdmGroup(mdmDTO,listMdm);
//		}
	}
	/**
	 * 对象转换
	 * @param mdmGroup
	 * @return
	 */
	private static MdmStoreGroupDTO convertToDto(MdmStoreGroup mdmGroup){
		MdmStoreGroupDTO dto = new MdmStoreGroupDTO();
		dto.setId(mdmGroup.getId());
		dto.setIsLeaf(mdmGroup.getIsLeaf());
		dto.setOrderNo(mdmGroup.getOrderNo());
		dto.setpStoreGroupNo(mdmGroup.getPStoreGroupNo());
		dto.setStoreGroupName(mdmGroup.getStoreGroupName());
		dto.setText(mdmGroup.getStoreGroupName());
		dto.setStoreGroupNo(mdmGroup.getStoreGroupNo());
		dto.setState(mdmGroup.getIsLeaf()==1?"open":"closed");
		return dto;
	}
	
	/**
	 * 
	* @Title: findStoreGropIsLeafByPNo 
	* @Description: TODO(返回门店的精度、纬度在地图上显示,只显示一级下面叶子节点信息) 
	* @param @param searchable
	* @param @return    设定文件 
	* @return List<MdmStoreDTO>    返回类型 
	* @throws
	 */
	public List<MdmStoreDTO> findStoreGropIsLeafByPNo(Searchable searchable){
		searchable.removePageable();
		Page<MdmStoreGroup> page = dao.findAll(searchable);
		
		List<MdmStoreDTO> listMdmDTO = new ArrayList<MdmStoreDTO>();
		
		if(page ==null || page.getContent().size()==0){
			throw new MyselfMsgException("没有找到当前节点下面门店信息");
		}
		
		for(MdmStoreGroup mdm:page.getContent()){			
			List<MdmStore> listMdmStore=mdmdao.findByStoreNo(mdm.getStoreGroupNo());
			MdmStore mdmStore =listMdmStore.get(0);
			MdmStoreDTO dto =new MdmStoreDTO();
			dto.setStoreNo(mdmStore.getStoreNo());
			dto.setStoreName(mdmStore.getStoreName());
			dto.setLatitude(mdmStore.getLatitude());
			dto.setLongitude(mdmStore.getLongitude());
			dto.setDeviceColor(mdmStore.getDeviceColor());
			dto.setChannelNum(mdmStore.getChannelNum());
			dto.setDeviceNum(mdmStore.getDeviceNum());
			listMdmDTO.add(dto);
		}
		return listMdmDTO;
		
	}
	
	/**
	 * 
	* @Title: findStoreGropIsLeaf 
	* @Description: TODO(循环寻找下面的叶子节点信息) 
	* @param @param searchable
	* @param @return    设定文件 
	* @return List<MdmStoreDTO>    返回类型 
	* @throws
	 */
	public List<MdmStoreDTO> findStoreGropIsLeaf(Searchable searchable){
		listDTO = new ArrayList<MdmStoreDTO>();
		searchable.removePageable();		
		recursiveStoreGropIsLeaf(searchable);
		return listDTO;
	}
	/**
	 * 
	* @Title: recursiveStoreGropIsLeaf 
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	* @param @param searchable    设定文件 
	* @return void    返回类型 
	* @throws
	 */
	private void recursiveStoreGropIsLeaf(Searchable searchable){
		
		Page<MdmStoreGroup> page = dao.findAll(searchable);
		if(page ==null || page.getContent().size()==0){
			logger.error("============节点下面没有信息");
		}
		for(MdmStoreGroup mdm:page.getContent()){
			//判断是否是叶子节点
			if(mdm.getIsLeaf()==1){
				List<MdmStore> listMdmStore=mdmdao.findByStoreNo(mdm.getStoreGroupNo());
				MdmStore mdmStore =listMdmStore.get(0);
				MdmStoreDTO dto =new MdmStoreDTO();
				dto.setStoreNo(mdmStore.getStoreNo());
				dto.setStoreName(mdmStore.getStoreName());
				dto.setLatitude(mdmStore.getLatitude());
				dto.setLongitude(mdmStore.getLongitude());
				dto.setDeviceColor(mdmStore.getDeviceColor());
				dto.setChannelNum(mdmStore.getChannelNum());
				dto.setDeviceNum(mdmStore.getDeviceNum());
				listDTO.add(dto);
			}else{
				//如果不是叶子节点还需要往下查找,并且需要判断该节点下面有数据
				searchable.addSearchFilter("pStoreGroupNo", SearchOperator.eq, mdm.getStoreGroupNo());	
				recursiveStoreGropIsLeaf(searchable);
			}
		}
	}
	
}
